'use strict';

module.exports = core;
const log = require('@renwang-0103/log');
const semver = require('semver');
const colors = require('colors')
const path = require('path')
const userHome = require('user-home')
const commander = require('commander');
const pathExists = require('path-exists').sync
const os = require('os')
const pkg = require('../package.json')
const constant = require('./const.js')
const init = require('@renwang-0103/init')
const exec = require('@renwang-0103/exec')


// let args;
let config;
const program = new commander.Command(); // 实例化commander
async function core() {
  try {
    
    await prepare()
    // 这个句 默认是会不打印出来，因为log的默认是info方法
    log.verbose('test', '狗蛋')
    registerCommander()
  } catch (e) {

    // log这个库的默认是info方法，
    log.error(e.message)
    // console.log(e.message, 'eee');
  }
  
  // log()
  // log.renwang('fff', '行')
  return 'Hello from core';
}


async function prepare() {
  checkpkgVersion()
  // checkNodeVersion()
  checkRoot()
  checkUserHome()
  // checkInputarguments()
  checkenv()
  // await checkLocalUpdate()
}


function registerCommander() {
  program.version(pkg.version).usage('<command> [option]').name(Object.keys(pkg.bin)[0])
  .option('-d, --debug', '是否开启调试模式', false).option('-tp, --targetPath <targetPath>', '是否制定本地调试文件', '')


  // 注册命令
  program.command('init [projectName]').option('-f, --force', '是否强制初始化项目').action(exec)
  // 监听命令参数   -d --debug  -v  -h   这样带-的就是命令参数，也叫属性
  program.on('option:debug', function() {
    
    if (program.opts().debug) {
      process.env.LOG_LEVEL = 'verbose'
    } else {
      process.env.LOG_LEVEL = 'info'
    }
    log.level = process.env.LOG_LEVEL
    log.verbose('大狗')
  })


  program.on('option:targetPath', function() {
    console.log(program.opts(), '命令中手动输入targetPath');
    process.env.CLI_TARGET_PATH = program.opts().targetPath
  })

  // 监听命令
  program.on('command:*', function(item) {
    // console.log(item, 'item');
    const useCommand = program.commands.map(item => item.name());
    const res = colors.red('不可用的命令' + item[0] + '||' + program.commands)
    // console.log(res);
    if (useCommand.length) {
      log.info('可用的命令', JSON.stringify(useCommand))
    }
  })



  
  program.parse(process.argv) // 这一步必须要有，
  
  // console.log(program, '呵呵', program.opts(), program.args);
  if (program.args.length < 1) {
    program.outputHelp()
  }
}


// 检查当前脚手架是否最新版本
async function checkLocalUpdate() {
  // 获取当前的版本号和模块名，package.json中获取
  // npm的api获取包的所有版本号
  // 比对哪些版本号大于当前版本号。
  // 提示用户更新
  const currentVersion = pkg.version;
  const npmName = pkg.name;
  const {getNpmVersion, getNpmSemverVersions} = require('@renwang-0103/get-npm-info')
  // const data = await getNpmVersion(npmName)
  const data = await getNpmSemverVersions(currentVersion, npmName)

  // console.log(data, 'data'); // 得到了比对后的版本号

  if (data && semver.gt(data, currentVersion)) {
    log.warn(colors.yellow('请手动更新'))
  }
}

// 检查环境变量
function checkenv() {
  const dotenv = require('dotenv');
  const dotenvPath = path.resolve(userHome, '.env')
  if (pathExists(dotenvPath)) {
    config = dotenv.config({path: dotenvPath})
  }
  // 如果没有配置.env文件就使用默认的
  config = createDefaultConfig()
  log.verbose('环境变量', config, process.env.CLI_HOME_PATH)

}

// 默认的cli脚手架配置
function createDefaultConfig() {
  const cliConfig = {
    home: userHome
  }
  if (process.env.CLI_HOME) {
    cliConfig['cliHome'] = path.join(userHome, process.env.CLI_HOME)
  } else {
    cliConfig['cliHome'] = path.join(userHome, constant.DEFAULT_CLI_HOME)
  }
  process.env.CLI_HOME_PATH = cliConfig.cliHome
  return cliConfig
}

// 检查入参
// function checkInputarguments() {
//   const miniMist = require('minimist'); // 使用工具库帮助检查参数, 比如输入 npm run dev 
//   args = miniMist(process.argv.slice(2));
//   // console.log(args, 'jfjdkfjdk');

//   checkArgs()
// }

// 检查参数里面有没有debug
// function checkArgs() {
//   if (args.debug) {
//     process.env.LOG_LEVEL = 'verbose'
//   } else {
//     process.env.LOG_LEVEL = 'info'
//   }
//   log.level = process.env.LOG_LEVEL
// }

function checkUserHome() {
  /** 检查用户主目录，如果没有这个主目录，后面用户缓存啥的都不能做 */
  // console.log(userHome, '就单单单价的');
  if (!userHome || !pathExists(userHome)) {
    throw new Error('当前用户主目录没有')
  }
}

function checkpkgVersion() {
  console.log(pkg.version);
  log.notice('rene', pkg.version)
}

/** 检查node版本号 */
// function checkNodeVersion() {
//   // 获取当前版本
//   console.log(process.version);
//   const currentVersion = process.version;
//   const lowVersion = constant.LOWEST_NODE_VERSION
//   // 比对最低版本，看是否大于最低版本
//   if (!semver.gte(currentVersion, lowVersion)) {
//     /** 当前版本是否大于等于最低版本 */
//     throw new Error(colors.red('版本不得行,版本低了'))
//   }
// }


/** 检查root账户 */
function checkRoot() {
  // process.getuid()
  // console.log('就烦', os.userInfo());
  // console.log(process.geteuid(), '甲方');
}



